/**
  * @description: excel操作
  * @author: lxz
  * @update: lxz(2021-01-18)
  */
import XLSX from 'xlsx'

/**
  * 导入excel转json
  * @param {File} file     excel文件对象
  * @param {Boolean=} rABS 是否将文件读取为二进制字符串（可选）
  */
export function importExcelToJson(file, rABS = false) {
  function fixdata(data) { // 文件流转BinaryString
    var o = ''
    var l = 0
    var w = 10240
    for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))
    o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
    return o
  }
  return new Promise((resolve, reject) => {
    let wb // 读取完成的数据
    const reader = new FileReader()
    reader.onload = function (e) {
      const data = e.target.result
      if (rABS) {
        wb = XLSX.read(btoa(fixdata(data)), { // 手动转化
          type: 'base64'
        })
      } else {
        wb = XLSX.read(data, {
          type: 'binary'
        })
      }
      // wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
      // wb.Sheets[Sheet名]获取第一个Sheet的数据
      const jsonStr = JSON.stringify(XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]))// 获取JSON字符串
      resolve(JSON.parse(jsonStr)) // 转化为JSON对象
    }
    reader.onerror = function (err) {
      reject(err)
    }
    if (rABS) {
      reader.readAsArrayBuffer(file)
    } else {
      reader.readAsBinaryString(file)
    }
  })
}

/**
  * json导出为excel
  * @param {Array} data       json数据, 事例：[[id,姓名,性别],[1,张三,男]]
  * @param {string=} filename 文件名称
  * @param {string=} wsName   工作薄名称
  */
export function exportJsonToExcel({
  data,
  filename = 'file.xlsx',
  wsName = 'Sheet1'
} = {}) {
  const wb = XLSX.utils.book_new()
  const ws = XLSX.utils.aoa_to_sheet(data)
  // 将数据添加到工作薄
  XLSX.utils.book_append_sheet(wb, ws, wsName)
  // 导出Excel
  XLSX.writeFile(wb, filename)
}
